package com.t309.tzy.common;
import com.t309.tzy.entity.TSysUser;
import org.springframework.core.convert.converter.Converter;
import org.springframework.util.StringUtils;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
/**
 * 通过反射进行 实体类转换
 *  java中获取Class对象的三种方式和区别
 *  Class对象的生成方式如下：
 * 1.类名.class 说明：JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象
 * 2.Class.forName("类名字符串")（注：类名字符串是包名+类名） 说明：装入类,并做类的静态初始化，返回Class的对象
 * 3.实例对象.getClass() 说明：对类进行静态初始化、非静态初始化；返回引用运行时真正所指的对象
 * (因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
*/                                      //Converter<原类型, 转换后的类型 >
public class TSysUserConverter implements Converter<String, TSysUser> {



    /**
     * 通过反射来创建类,
     * 反射 : 用字符串来实现一个代码的调用
     * 通过 String可以把我们想输入的内容输入到程序中去,
     * 通过 String转换成想要的对象
     * @param s
     * @return
     */
    @Override
    public TSysUser convert(String s) {
        TSysUser user = new TSysUser();
        //获取class对象
        Class<? extends TSysUser> aClass = user.getClass();
        String[] splits = s.split(",");
        for(String split: splits){
            String[] kvs = split.split(":");
            try {
                Method method = aClass.getDeclaredMethod("set" + StringUtils.capitalize(kvs[0]),String.class);
                method.invoke(user,kvs[1]);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
        return user;
    }
}
